#include <iostream>
#include <cstdio>
#include <cerrno>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
using namespace std;
#define NUM 10

void* Thread_Run(void* args)
{
    int cnt = 5;
    while(cnt--)
    {
        cout<<cnt<<" pthread is runing-->name:"<<(char*)args<<"obtain slef id:"<<pthread_self()<<endl;
        sleep(1);
    }
    pthread_exit((void*)11);  //线程终止
}
//线程取消测试
int main()
{
    pthread_t td; //线程标识符
    pthread_create(&td,nullptr,Thread_Run,(void*)"thread-1"); //线程创建
    void* ret;
    sleep(3);
   // pthread_cancel(td);  //线程取消
    pthread_join(td,&ret);  //线程等待
    cout<<"a pthread quit-->ret："<<(int64_t)ret<<"obtain slef id:"<<pthread_self()<<endl;  
    return 0;
}
























//学习多线程：线程创建、线程等待、线程终止--》让线程执行我们想让它做的事
// enum 
// {
//    ERROR = 0,
//    OK = 1
// };
// //创建线程对象
// class ThreadData
// {
// public:
//     //构造函数
//     ThreadData(string name,int id,int top,uint64_t time):
//     _name(name),_id(id),
//     _createTime(time),_top(top),
//     _result(0),_status(OK)
//     {

//     }  
//     //析构函数
//     ~ThreadData()
//     {}
// public:
//     //输入
//     string _name;  //线程名
//     int _id;   //编号
//     uint64_t _createTime;  //创建的时间-->时间戳
//     int _top;  //需要计算1-top的之和
//     //返回
//     int _result;  //结果
//     int _status; //状态
// };

// void* thread_run(void* args)
// {
//     // char* name = (char*)args;
//     ThreadData *td = static_cast<ThreadData *> (args); //安全的强制类型转化
//      for(int i = 1;i <= td->_top;i++)
//      {//计算[1,top]的和
//         td->_result += i;
//      }
//      cout<<td->_name<<"-->cal done!"<<endl;
//     // while(true)
//     // {
//     //     //cout<<"new thread running,my thread name is :"<<name<<endl;
//     //      cout<<"new thread running,my thread name is :"<<td->_name<<endl;
//     //     //exit(10);
//     //     sleep(1);
//     //     break;
//     // }
//     //delete name; 
//     //使用pthread_exit函数-->终止进程
//     //pthread_exit((void*)2);
//     pthread_exit((void*)td);
//     //return nullptr;  
// }

// int main()
// {
//     srand(time(nullptr));
//     pthread_t t[NUM];  //定义一个文件标识符--->创建一批线程
//     for(int i = 0;i < NUM;i++)
//     {
//         //char tname[64];  //存在bug
//         //char* tname = new char[64];
//         char tname[64];  //和ThreadData* thread = new ThreadData(tname,i+5,100+i,time(nullptr))使用，不存在bug
//         sprintf(tname,"thread-%d",i+1);  //每个线程的名字
//         //ThreadData thread(tname,i+1,time(nullptr));  //这样写存在bug，每个线程指向同一个共享区地址
//         ThreadData* thread = new ThreadData(tname,i+5,100+i,time(nullptr)); //堆
//         sleep(1);
//         pthread_create(t+i,nullptr,thread_run,thread); 
//     }
//      sleep(3);
//     void* ret = nullptr;  //获取退出结果
//     for(int i = 0;i < NUM;i++)
//     {
//         int n  = pthread_join(t[i],&ret);
//         if(n != 0) 
//         {
//             cerr<<"pthread_join error:";
//         }
//         ThreadData * td = static_cast<ThreadData *> (ret);
//         if(td->_status == OK)
//         cout<<td->_name<<"计算结果是："<<
//         td->_result<<"它计算的是[1,"<<td->_top<<"])"<<endl;   
//         // if( (static_cast<ThreadData *> (ret))->_status == OK)
//         // cout<<(static_cast<ThreadData *> (ret))->_name<<"计算结果是："<<
//         // (static_cast<ThreadData *> (ret))->_result<<"它计算的是[1,"<<(static_cast<ThreadData *> (ret))->_top<<"])"<<endl;   
   
//        // ret = static_cast<ThreadData *> (ret); //-->error
//         // cout<<"pthread quit:--->name:"<<(static_cast<ThreadData *> (ret))->_name
//         // <<"id:"<<(static_cast<ThreadData *> (ret))->_id
//         // <<"time:"<<(static_cast<ThreadData *> (ret))->_createTime<<endl;
//         //cout<<"pthread quit ....-->ret:"<<endl;
//         //cout<<"pthread quit ....-->ret:"<<(uint64_t)ret<<endl;
//     }
//     cout<<"all pthread quit ...."<<endl;
//     //sleep(3);
//     // while(true)
//     // {
//     //     cout<<"main thread running,new thread id:"<<t<<endl;
//     //     sleep(1);
//     // }
//     return 0;
// }